/*
 * @Author: 马思宁 598138645@qq.com
 * @Date: 2024-04-29 08:33:05
 * @LastEditors: 马思宁 598138645@qq.com
 * @LastEditTime: 2024-05-20 16:06:18
 * @FilePath: \v-koa\src\controller\captchaImage.controller.js
 * @Description: 获取验证控制器
 */
const redis = require("../../redis");
const svgCaptcha = require("svg-captcha");
const { v4: uuidv4 } = require("uuid");

svgCaptchaMap = new Map();

class captchaImageController {
  async create(ctx, next) {
    const { text, data } = svgCaptcha.create({
      size: 4, // 验证码长度
      width: 130, // 验证码图片宽度
      height: 40, // 验证码图片高度
      fontSize: 30, // 验证码字体大小
      noise: Math.floor(Math.random() * 5), //干扰线条数目_随机0-5条 可以增加一些噪点，但不影响背景
      color: true, //验证码字符是否有颜色，默认是没有，但是如果设置了背景颜色，那么默认就是有字符颜色
      background: "#f1f5f8", //背景色
      ignoreChars: "0o1i", // 避免混淆字符
    });

    // 存储验证码到Map中，实际生产环境中建议使用Redis等存储
    const key = Math.random().toString(36).substring(2); // 生成随机的key
    try {
      redis.setex(key, 60 * 5, text); //设置5分钟过期
    } catch (error) {
      console.log("error", error);
    }
    svgCaptchaMap.set("captchakey", data);
    // 将验证码图片转换为base64格式
    let base64Img = new Buffer.from(data).toString("base64"); // 验证码
    ctx.set("Cache-Control", "no-store");
    ctx.set("Pragma", "no-cache");
    ctx.set("Content-Type", "image/svg+xml");
    ctx.body = {
      captchaEnabled: true, // 是否开启验证码
      code: 200,
      msg: "操作成功",
      img: base64Img,
      uuid: uuidv4(),
    };
    // 将验证码图片返回给客户端
    ctx.cookies.set("captcha_key", key, {
      maxAge: 1000 * 60 * 60,
      httpOnly: true,
    }); // 将key存储到cookie中，供后续验证使用
  }
  /**
   *
   * @param {*} ctx
   * @param {*} next
   * @description 获取验证码svg图片展示
   */
  async showSvg(ctx, next) {
    ctx.set("Content-Type", "image/svg+xml");
    ctx.body = svgCaptchaMap.get("captchakey");
  }
}
module.exports = new captchaImageController();
